package caretakerV3;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

import receiver.MiniEditeur;
import receiver.MiniEditeurImpl;

import mementoV3.MementoV3;

public class GestionDefaireImpl implements GestionDefaire {

	private MiniEditeur _mini;

	public GestionDefaireImpl( MiniEditeur mini) {
		super();
		this._defaireList = new Stack<MementoV3>();
		this._refaireList = new Stack<MementoV3>();
		this._mini = mini;
	}
	int nbDefaire = 0;

	int nbRefaire = 0;

	private List<MementoV3> _defaireList;

	private List<MementoV3> _refaireList;

	/**
	 * Consiste à rejouer une action déjà défaite.
	 * rejoue la premiere commande de la pile _refairePile 
	 */
	@Override
	public void refaire() {
		if(!_refaireList.isEmpty()){
			((MiniEditeurImpl)_mini).getBuffer().setBuffer(new StringBuilder(""));
			((MiniEditeurImpl)_mini).getSelection().setDebut(0);
			((MiniEditeurImpl)_mini).getSelection().setFin(0);

			int i = _refaireList.size() - 1;
			MementoV3 mem = _refaireList.get(i);
			_refaireList.remove(i);
			_defaireList.add(mem);

			for(i = 0 ; i < _defaireList.size() ; i ++){
				MementoV3 m = _defaireList.get(i);
				m.getCommand().setMemento(m);
			}
		}
	}

	/**
	 * Consiste à revenir à l'état avant la dernière action
	 * transfert la dernière commande de la pile _defairePile vers la pile des _refairePile 
	 */

	@Override
	public void defaire() {
		if(!_defaireList.isEmpty()){
			((MiniEditeurImpl)_mini).getBuffer().setBuffer(new StringBuilder(""));
			((MiniEditeurImpl)_mini).getSelection().setDebut(0);
			((MiniEditeurImpl)_mini).getSelection().setFin(0);

			int i = _defaireList.size() - 1;
			MementoV3 mem = _defaireList.get(i);
			_refaireList.add(mem);
			_defaireList.remove(i);

			i = 0;
			for(i = 0 ; i < _defaireList.size() ; i ++){
				MementoV3 m = _defaireList.get(i);
				m.getCommand().setMemento(m);
			}
		}
	}

	/**
	 * Sauvegarde les actions effectuées par l'utilisateur
	 */
	@Override
	public void sauvegarder(MementoV3 m) {
		nbDefaire ++;
		_defaireList.add(m);
		_refaireList.clear();
	}

}
